package com.aabte.spring.annotation.config;

import org.springframework.beans.factory.Aware;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.EmbeddedValueResolverAware;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.annotation.Resource;
import javax.inject.Inject;

/**
 * 自动装配，Spring利用依赖注入（DI），完成对IOC容器中各组件的依赖关系的赋值
 * <p>
 * {@link Autowired}自动装配：可以使用在构造器(如果只有一个参数，可以省略)、参数、方法、属性上
 *      优先使用类型匹配进行注入，{@link ApplicationContext#getBean(Class)}
 *      如果有相同类型的Bean使用名称匹配进行注入， {@link ApplicationContext#getBean(String)}
 *      也可以使用{@link Qualifier}注解指定Bean的名称进行注入
 *      {@link Primary} 当有多个类型的Bean注入时，可以使用此注解指定优先使用哪个
 *      Spring使用{@link AutowiredAnnotationBeanPostProcessor}后置处理器来完成自动装配功能
 * <p>
 * {@link Resource}和{@link Inject}(JSR250)注解自动装配：
 *      {@link Resource}默认使用Bean名称进行注入，不支持与{@link Primary}配合使用
 *      {@link Inject}需要导入javax.inject包，功能和{@link Autowired}一样
 * <p>
 * Spring的{@link Aware}相关接口实现装配：
 *      {@link ApplicationContextAware} 注入IOC容器对象
 *      {@link BeanNameAware} 注入Bean的名称
 *      {@link BeanFactoryAware} 注入BeanFactory对象
 *      {@link EmbeddedValueResolverAware} 注入字符串解析器对象
 * {@link Aware}接口相关实现的处理器{@link org.springframework.context.support.ApplicationContextAwareProcessor#invokeAwareInterfaces}
 * @author Daniel
 */
@Configuration
@ComponentScan(value = "com.aabte.spring")
public class AutowiredConfig {

}
